package com.gl.admin.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gl.admin.common.Result;
import com.gl.admin.exception.ServiceException;
import com.gl.admin.vo.EngLishVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.util.IOUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController()
@RequestMapping("/api/english-static")
@Api(tags = "英语静态资源获取")
public class EnglishStaticController {

    /**
     * 获取全部英语单词列表
     * @param input 单词名称-筛选
     * @param pageNum 页码
     * @param pageSize 页数
     * @return 结果
     */
    @ApiOperation("获取全部英语单词列表")
    @GetMapping("/getEnglishList")
    public Result getEnglishList(@RequestParam(defaultValue = "") String input, @RequestParam(defaultValue = "1") Long pageNum, @RequestParam(defaultValue = "20") Long pageSize) {
        pageNum = pageNum == 0 ? 1 : pageNum;
        pageSize = pageSize == 0 ? 20 : pageSize;
        //获取json文件的数据
        List<Map<String, String>> results  = this.getDayJsonData();
        //判断是否有输入的值
        if (StrUtil.isNotEmpty(input)) {
            //筛选符合的数据返回
            results = results.stream().filter(item -> item.get("label").contains(input)).collect(Collectors.toList());
        }

        System.out.println(results);
        //设置分页
        Map<String, Object> result = new HashMap<>();
        //判断查询出的数据是否等于要分页的数据
        if (results.size() > pageSize) {
            results = results.stream().skip((long) (pageNum - 1) * pageSize).limit(pageSize).
                    collect(Collectors.toList());
            result.put("rows",results);
        }else {
            result.put("rows",results);
        }
        result.put("total", results.size());
        result.put("pages", pageNum);
        result.put("pageSize", pageSize);
        return Result.success(result);

    }

    /**
     * 对列表进行手动分页，返回指定页面的子列表。
     *
     * @param list   原始数据列表，其中每个元素是一个包含字符串键值对的映射。
     * @param page   当前请求的页码，页码从1开始。
     * @param rows   每页显示的记录数。
     * @return       返回指定页码的子列表，如果页码无效或超出范围，则返回空列表。
     */
    public static List<Map<String, String>> subList(List<Map<String, String>> list, int page, int rows) {
        // 创建一个新的列表来存储分页后的数据
        List<Map<String, String>> listSort = new ArrayList<>();
        // 获取原始列表的大小
        int size = list.size();
        // 计算分页的起始索引，如果页码为1，则从0开始，否则计算当前页之前的所有记录
        int pageStart = page == 1 ? 0 : (page - 1) * rows;
        // 计算分页的结束索引，如果当前页的数据不足一页，则结束索引为列表大小，否则为页码乘以每页记录数
        int pageEnd = size < page * rows ? size : page * rows;
        // 如果起始索引小于列表大小，说明有数据可以分页，进行分页操作
        if (size > pageStart) {
            // 使用subList方法获取从pageStart到pageEnd的子列表
            listSort = list.subList(pageStart, pageEnd);
        }
        // 计算总页数，整除每页记录数，如果列表大小不是每页记录数的整数倍，则最后一页可能不满
        /*int totalPage = list.size() / rows;
        // 如果有剩余记录，需要增加一页来显示剩余的记录
        if (list.size() % rows != 0) {
            totalPage++;
        }*/
        // 返回分页后的子列表
        return listSort;
    }

    /**
     * 获取 JSON 文件中的数据。
     * @return 解析后的 List<Map<String, String>> 数据
     */
    private List<Map<String, String>> getDayJsonData() {
        //获取项目的根目录地址
        String projectPath = System.getProperty("user.dir");
        //文件的地址 File.separator使用系统的/分隔符
        String fileName = projectPath + File.separator + "static" + File.separator + "data.json";
        System.out.println(fileName);
        File file = new File(fileName);
        if (!file.exists()) {
            throw new ServiceException(500, "文件 " + fileName + " 不存在");
        }
        List<Map<String, String>> result = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            //一行一行的读取
            while ((line = reader.readLine()) != null) {
                //判断line 不能是空的
                if (StrUtil.isNotBlank(line)) {
                    //如果不是大括号就添加
                    if (!line.contains("{") || !line.contains("}")) {
                        // 分割键和值
                        String[] parts = line.split(": ");
                        // 检查是否有两个部分
                        if (parts.length == 2) {
                            // 去除可能的空格
                            String key = parts[0].trim().replaceAll("[\"']", "");
                            // 去除值两边的引号和可能的空格
                            String value = parts[1].trim().replaceAll("[\"']", "");
                            // 创建Map并添加键值对
                            Map<String, String> map = new HashMap<>();
                            map.put("label", key);
                            map.put("value", value.replaceAll(",",""));
                            //添加到集合里面
                            result.add(map);
                        }
                    }
                }
            }
            return result;
        } catch (IOException e) {
            e.printStackTrace();
            throw new ServiceException(500, "读取文件或解析 JSON 过程中出现异常: " + e.getMessage());
        }
    }

}
